package parser;

import exercicio.Lexer;
import exercicio.Token;
import exercicio.TokenType;

public class CopyOfParserTemp {

	private Lexer lexer;
	private Token currentToken;
	private int numTemp;
	private static int resposta = 0;

	
	private void acceptToken(TokenType type) {
		if (currentToken.getToken() == type) {
			currentToken = lexer.nextToken();
		} else {
			throw new RuntimeException("Token inesperado. Foi lido um \""
					+ currentToken.getToken() + "\", quando o esperado era \""
					+ type + "\".");
		}
	}

	private void acceptToken() {
		currentToken = lexer.nextToken();
	}

	public void parse(String input) {
		lexer = new Lexer();
		lexer.reset(input);
		acceptToken();
		parseProgram();
	}

	private void parseProgram() {
		parseCommand();
	}

	private void parseCommand() {
		parseExpr();
//		acceptToken(TokenType.PT_VIRG);
	}

	private int parseExpr() {
		int termVal = parseTerm();
		
		termVal = numTemp;
		
		if (currentToken.getToken() == TokenType.ADD) {
			System.out.println("Leu Somador");
			acceptToken();
			int forcando_a_barra = Integer.parseInt(currentToken.getLexema());			
			int expr1Val = forcando_a_barra; //parseExpr();
			int x = termVal + expr1Val;
			System.out.println("Soma "+termVal+" + "+expr1Val+" = "+x);
			resposta = x;
			return parseTerm();//parseRestExpr(x);
			}
		return parseTerm();//parseRestExpr(termVal);
	}

	private int parseRestExpr(int esq) {
			int dir = Integer.parseInt(currentToken.getLexema());//parseTerm();
			int produto = esq * dir;
			System.out.println("multiplicação "+esq+" * "+dir+" = "+produto);
			resposta = produto;
			parseFactor();
			return parseRestTerm();
//			} else {
//				System.out.println("esq: " + esq);
//				parseFactor();
//				return parseRestTerm();
//			}
	}

	private int parseTerm() {
		parseFactor();
		return parseRestTerm();
	}

	private int parseRestTerm() {
		
		if (currentToken.getToken() == TokenType.MULT) {
			System.out.println("Leu multiplicador");
			acceptToken();
			parseRestExpr(resposta);
		} else {
			/* do nothing! */
		}
		return 0;
	}

	private void parseFactor() {
		if (currentToken.getToken() == TokenType.NUMERO) {
			System.out.println("Leu numero "+ currentToken.getLexema());
			if (resposta == 0){
				numTemp = Integer.parseInt(currentToken.getLexema());
			} else{
				numTemp = resposta;
			}
			
			acceptToken();
		} else if (currentToken.getToken() == TokenType.ABRE_PAR) {
			System.out.println("Leu Abre Parenteses");
			acceptToken();
			parseExpr();
			acceptToken(TokenType.FECHA_PAR);
		} else if (currentToken.getToken() == TokenType.PT_VIRG) {
			System.out.println("Leu Ponto e Virgula");
			/* do nothing */
		} else {
			throw new RuntimeException("Token inesperado: "
					+ currentToken.getToken() + ".");
		}
	}

	public static void main(String[] args) {
		String input = "(1+2)*4+5*2+1;"; //35 ou 51
		CopyOfParserTemp parser = new CopyOfParserTemp();
		System.out.println("Iniciou a analise sintatica");
		System.out.println("Expressão a ser analisada "+input);
		parser.parse(input);
		System.out.println("O resultado da expressão é: " + resposta);
		System.out.println("Finalizou sem problemas!");
	}
}
